package leetcode.leetcode136;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

/**
 * @author czt
 * @version 1.0
 * @since 2025/1/7
 */
public class Leetcode136 {

    public int singleNumber(int[] nums) {
        HashMap<Integer, List<Integer>> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            List<Integer> list = map.get(nums[i]);
            if (list == null) {
                list = new ArrayList<>();
                map.put(nums[i], list);
            }
            list.add(i);
        }
        for (List<Integer> list : map.values()) {
            if (list.size() == 1) {
                return nums[list.get(0)];
            }
        }
        return 0;
    }

    /**
     * 返回唯一元素
     * @param nums 数组
     * @return 唯一元素
     * 1.准备一个set集合，逐一放入数组元素
     * 2.遇到重复的，则删除
     * 3.最后留下来的，就是那个没有重复的数字
     */
    public int singleNumber2(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (!set.add(num)) {
                set.remove(num);
            }
        }
        return set.iterator().next();
    }

    /**
     * 返回唯一元素
     * @param nums 数组
     * @return 唯一元素
     * 1.任何相同的数字异或，结果都是0
     * 2.任何数字与0异或，结果是数字本身
     */
    public int singleNumber3(int[] nums) {
        int num = nums[0];
        for (int i = 1; i < nums.length; i++) {
            num ^= nums[i];
        }
        return num;
    }
}
